home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 January / execd1200.iso / Shareware / Blocks 3 / setup.exe / Source / MON.C < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-03  |  9.6 KB  |  361 lines

  1. #include <allegro.h>
  2. #include <jgmod.h>
  3. #include <blocks3.h>
  4.  
  5. void Monster(void)
  6. {
  7.  int i, j, k;
  8.  
  9.  Monster_Die_Check();
  10.  
  11.  for (i = 0; i < mon_count; i++)
  12.  {
  13.   mon[i].count++;
  14.  
  15.   if (mon[i].count > mon[i].speed)
  16.   {
  17.    mon[i].count = 1;
  18.  
  19.    if (mon[i].type == MON0) Monster_Mon0(i);
  20.    if (mon[i].type == MON1) Monster_Mon1(i);
  21.    if (mon[i].type == MON2) Monster_Mon1(i);
  22.   }
  23.  
  24.   Monster_Draw(i);
  25.  }
  26.  
  27.  for (k = 0; k < 2; k++)
  28.  for (j = 0; j < 15; j++)
  29.  for (i = 0; i < 20; i++)
  30.  if (map[i][j][k] == RESERVE0) map[i][j][k] = 0;
  31.  
  32.  for (i = 0; i < mon_count; i++)
  33.  {
  34.   map[mon[i].x/32][mon[i].y/32][mon[i].z/8] = RESERVE0;
  35.   map[(mon[i].x + 31)/32][mon[i].y/32][mon[i].z/8] = RESERVE0;
  36.   map[mon[i].x/32][(mon[i].y + 31)/32][mon[i].z/8] = RESERVE0;
  37.   map[(mon[i].x + 31)/32][(mon[i].y + 31)/32][mon[i].z/8] = RESERVE0;
  38.  }
  39. }
  40.  
  41. void Monster_Draw(int m_no)
  42. {
  43.  if ((mon[m_no].dx) || (mon[m_no].dy)) mon[m_no].frame++;
  44.  if (Player_Frame(mon[m_no].frame) == -1) mon[m_no].frame = 0;
  45.  
  46.  if (mon[m_no].dir == 4) DirtyList(mon[m_no].x, mon[m_no].y, mon[m_no].z, 32, 40, mon_pic[0][0 + Player_Frame(mon[m_no].frame)]);
  47.  if (mon[m_no].dir == 1) DirtyList(mon[m_no].x, mon[m_no].y, mon[m_no].z, 32, 40, mon_pic[0][3 + Player_Frame(mon[m_no].frame)]);
  48.  if (mon[m_no].dir == 2) DirtyList(mon[m_no].x, mon[m_no].y, mon[m_no].z, 32, 40, mon_pic[0][6 + Player_Frame(mon[m_no].frame)]);
  49.  if (mon[m_no].dir == 8) DirtyList(mon[m_no].x, mon[m_no].y, mon[m_no].z, 32, 40, mon_pic[0][9 + Player_Frame(mon[m_no].frame)]);
  50. }
  51.  
  52. void Monster_Change_Dir(int m_no, int x, int y, int z)
  53. {
  54.  if (z == 0)
  55.  {
  56.   if (mon[m_no].dy == -1)
  57.   {
  58.    mon[m_no].dir = 0;
  59.    if (map[x][y + 1][0] == 0) mon[m_no].dir = 4;
  60.    if (map[x + 1][y][0] == 0) mon[m_no].dir = 2;
  61.    if (map[x - 1][y][0] == 0) mon[m_no].dir = 8;
  62.   }
  63.  
  64.   if (mon[m_no].dy == 1)
  65.   {
  66.    mon[m_no].dir = 0;
  67.    if (map[x][y - 1][0] == 0) mon[m_no].dir = 1;
  68.    if (map[x - 1][y][0] == 0) mon[m_no].dir = 8;
  69.    if (map[x + 1][y][0] == 0) mon[m_no].dir = 2;
  70.   }
  71.  
  72.   if (mon[m_no].dx == 1)
  73.   {
  74.    mon[m_no].dir = 0;
  75.    if (map[x - 1][y][0] == 0) mon[m_no].dir = 8;
  76.    if (map[x][y + 1][0] == 0) mon[m_no].dir = 4;
  77.    if (map[x][y - 1][0] == 0) mon[m_no].dir = 1;
  78.   }
  79.  
  80.   if (mon[m_no].dx == -1)
  81.   {
  82.    mon[m_no].dir = 0;
  83.    if (map[x + 1][y][0] == 0) mon[m_no].dir = 2;
  84.    if (map[x][y - 1][0] == 0) mon[m_no].dir = 1;
  85.    if (map[x][y + 1][0] == 0) mon[m_no].dir = 4;
  86.   }
  87.  }
  88.  else
  89.  {
  90.   if (mon[m_no].dy == -1)
  91.   {
  92.    mon[m_no].dir = 0;
  93.    if ((map[x][y + 1][1] == 0) && (map[x][y + 1][0] & FULL)) mon[m_no].dir = 4;
  94.    if ((map[x + 1][y][1] == 0) && (map[x + 1][y][0] & FULL)) mon[m_no].dir = 2;
  95.    if ((map[x - 1][y][1] == 0) && (map[x - 1][y][0] & FULL)) mon[m_no].dir = 8;
  96.   }
  97.  
  98.   if (mon[m_no].dy == 1)
  99.   {
  100.    mon[m_no].dir = 0;
  101.    if ((map[x][y - 1][1] == 0) && (map[x][y - 1][0] & FULL))mon[m_no].dir = 1;
  102.    if ((map[x - 1][y][1] == 0) && (map[x - 1][y][0] & FULL))mon[m_no].dir = 8;
  103.    if ((map[x + 1][y][1] == 0) && (map[x + 1][y][0] & FULL))mon[m_no].dir = 2;
  104.   }
  105.  
  106.   if (mon[m_no].dx == 1)
  107.   {
  108.    mon[m_no].dir = 0;
  109.    if ((map[x - 1][y][1] == 0) && (map[x - 1][y][0] & FULL)) mon[m_no].dir = 8;
  110.    if ((map[x][y + 1][1] == 0) && (map[x][y + 1][0] & FULL)) mon[m_no].dir = 4;
  111.    if ((map[x][y - 1][1] == 0) && (map[x][y - 1][0] & FULL)) mon[m_no].dir = 1;
  112.   }
  113.  
  114.   if (mon[m_no].dx == -1)
  115.   {
  116.    mon[m_no].dir = 0;
  117.    if ((map[x + 1][y][1] == 0) && (map[x + 1][y][0] & FULL)) mon[m_no].dir = 2;
  118.    if ((map[x][y - 1][1] == 0) && (map[x][y - 1][0] & FULL)) mon[m_no].dir = 1;
  119.    if ((map[x][y + 1][1] == 0) && (map[x][y + 1][0] & FULL)) mon[m_no].dir = 4;
  120.   }
  121.  }
  122.  
  123.  
  124.  mon[m_no].dx = 0;
  125.  mon[m_no].dy = 0;
  126.  
  127.  if (mon[m_no].dir == 1) mon[m_no].dy = -1;
  128.  if (mon[m_no].dir == 2) mon[m_no].dx = 1;
  129.  if (mon[m_no].dir == 4) mon[m_no].dy = 1;
  130.  if (mon[m_no].dir == 8) mon[m_no].dx = -1;
  131.  
  132.  if (mon[m_no].dir == 0) mon[m_no].dir = 4;
  133.  
  134.  mon[m_no].count = -4;
  135. }
  136.  
  137. int Monster_Sight(int x, int y, int z, int dir)
  138. {
  139.  int dx, dy;
  140.  
  141.  dx = 0;
  142.  dy = 0;
  143.  
  144.  if (dir == 1) dy = -1;
  145.  if (dir == 2) dx = 1;
  146.  if (dir == 4) dy = 1;
  147.  if (dir == 8) dx = -1;
  148.  
  149.  while ((!(map[x][y][z] & FULL)) &&
  150.        ((x != ply[0].x/32) || (y != ply[0].y/32) ||
  151.         (x != (ply[0].x + 31)/32) || (y != (ply[0].y + 31)/32)))
  152.  {
  153.   x += dx;
  154.   y += dy;
  155.  }
  156.  
  157.  if (map[x][y][z] & FULL) return 0;
  158.  
  159.  return 1;
  160.  
  161. }
  162.  
  163. void Monster_Mon3(int m_no)
  164. {
  165.  if (mon[m_no].state == PATROL) Monster_Patrol(m_no);
  166.  
  167.  if (Monster_Sight(mon[m_no].x/32, mon[m_no].y/32, mon[m_no].z/8, mon[m_no].dir))
  168.  {
  169.   mon[m_no].speed = 0;
  170.  }
  171. }
  172.  
  173. void Monster_Move(int m_no)
  174. {
  175.  map[mon[m_no].x/32][mon[m_no].y/32][mon[m_no].z/8] = 0;
  176.  map[(mon[m_no].x + 31)/32][mon[m_no].y/32][mon[m_no].z/8] = 0;
  177.  map[mon[m_no].x/32][(mon[m_no].y + 31)/32][mon[m_no].z/8] = 0;
  178.  map[(mon[m_no].x + 31)/32][(mon[m_no].y + 31)/32][mon[m_no].z/8] = 0;
  179.  
  180.  mon[m_no].x += mon[m_no].dx;
  181.  mon[m_no].y += mon[m_no].dy;
  182.  mon[m_no].z += mon[m_no].dz;
  183.  
  184.  if (mon[m_no].z == 0) mon[m_no].dz = 0;
  185.  
  186.  map[mon[m_no].x/32][mon[m_no].y/32][mon[m_no].z/8] = RESERVE0;
  187.  map[(mon[m_no].x + 31)/32][mon[m_no].y/32][mon[m_no].z/8] = RESERVE0;
  188.  map[mon[m_no].x/32][(mon[m_no].y + 31)/32][mon[m_no].z/8] = RESERVE0;
  189.  map[(mon[m_no].x + 31)/32][(mon[m_no].y + 31)/32][mon[m_no].z/8] = RESERVE0;
  190. }
  191.  
  192. void Monster_Mon0(int m_no)
  193. {
  194.  if (mon[m_no].state == PATROL) Monster_Patrol(m_no);
  195. }
  196.  
  197. void Monster_Mon2(int m_no)
  198. {
  199.  if (mon[m_no].state == PATROL) Monster_Patrol(m_no);
  200. }
  201.  
  202. void Monster_Mon1(int m_no)
  203. {
  204.  if (mon[m_no].state == PATROL) Monster_Patrol(m_no);
  205.  if (mon[m_no].state == TRACK) Monster_Track(m_no);
  206.  
  207.  if ((mon[m_no].state != TRACK) && (Monster_Sight(mon[m_no].x/32, mon[m_no].y/32, mon[m_no].z/8, mon[m_no].dir)))
  208.  {
  209.   mon[m_no].speed = 2;
  210.   mon[m_no].state = TRACK;
  211.   Add_Sound(mon[m_no].x/32, SFX_ROAR);
  212.  }
  213. }
  214.  
  215. void Monster_Patrol(int m_no)
  216. {
  217.  if ((mon[m_no].dz == 0) &&
  218.      (mon[m_no].x%32 == 0) &&
  219.      (mon[m_no].y%32 == 0) &&
  220.  
  221.      (((map[mon[m_no].x/32 + mon[m_no].dx][mon[m_no].y/32 + mon[m_no].dy][mon[m_no].z/8 + mon[m_no].dz] != 0) &&
  222.       ((map[mon[m_no].x/32 + mon[m_no].dx][mon[m_no].y/32 + mon[m_no].dy][mon[m_no].z/8 + mon[m_no].dz] & SWITCH) == 0))
  223.  ||
  224.      (map_laser[mon[m_no].x/32 + mon[m_no].dx][mon[m_no].y/32 + mon[m_no].dy][mon[m_no].z/8 + mon[m_no].dz] != 0)
  225.  ||
  226.      ((mon[m_no].z/8 == 1) &&
  227.      ((map[mon[m_no].x/32 + mon[m_no].dx][mon[m_no].y/32 + mon[m_no].dy][0] & FULL) == 0)
  228.     )))
  229.  {
  230.   if ((mon[m_no].z /8 == 1) && (map[mon[m_no].x/32][mon[m_no].y/32][0] == 0))
  231.   {
  232.    mon[m_no].dx = 0;
  233.    mon[m_no].dy = 0;
  234.    mon[m_no].dz = -1;
  235.    return;
  236.   }
  237.   else
  238.   Monster_Change_Dir(m_no, mon[m_no].x/32, mon[m_no].y/32, mon[m_no].z/8);
  239.   return;
  240.  }
  241.  
  242.  Monster_Move(m_no);
  243. }
  244.  
  245. void Monster_Track(int m_no)
  246. {
  247.  if ((mon[m_no].dz == 0) &&
  248.      (mon[m_no].x%32 == 0) &&
  249.      (mon[m_no].y%32 == 0))
  250.  {
  251.   if ((mon[m_no].z/8 == 1) && (map[mon[m_no].x/32][mon[m_no].y/32][0] == 0))
  252.   {
  253.    mon[m_no].dx = 0;
  254.    mon[m_no].dy = 0;
  255.    mon[m_no].dz = -1;
  256.    return;
  257.   }
  258.   else Monster_Change_Dir_Track(m_no, 0);
  259.  }
  260.  
  261.  Monster_Move(m_no);
  262. }
  263.  
  264. void Monster_Change_Dir_Track(int m_no, int p_no)
  265. {
  266.  mon[m_no].dx = 0;
  267.  mon[m_no].dy = 0;
  268.  
  269.  if ((ply[p_no].x/32 > mon[m_no].x/32) &&
  270.      (!Check_Map(mon[m_no].x + 1, mon[m_no].y, mon[m_no].z, FULL, 0, 1)) &&
  271.      (!Check_Map(mon[m_no].x + 1, mon[m_no].y, mon[m_no].z, PICKUP, 0, 1)))
  272.   mon[m_no].dx = 1;
  273.  
  274.  if ((ply[p_no].x/32 < mon[m_no].x/32) &&
  275.      (!Check_Map(mon[m_no].x - 1, mon[m_no].y, mon[m_no].z, FULL, 0, 1)) &&
  276.      (!Check_Map(mon[m_no].x - 1, mon[m_no].y, mon[m_no].z, PICKUP, 0, 1)))
  277.   mon[m_no].dx = -1;
  278.  
  279.  if ((ply[p_no].y/32 > mon[m_no].y/32) &&
  280.      (!Check_Map(mon[m_no].x + mon[m_no].dx, mon[m_no].y + 1, mon[m_no].z, FULL, 0, 1)) &&
  281.      (!Check_Map(mon[m_no].x + mon[m_no].dx, mon[m_no].y + 1, mon[m_no].z, PICKUP, 0, 1)))
  282.   mon[m_no].dy = 1;
  283.  
  284.  if ((ply[p_no].y/32 < mon[m_no].y/32) &&
  285.      (!Check_Map(mon[m_no].x + mon[m_no].dx, mon[m_no].y - 1, mon[m_no].z, FULL, 0, 1)) &&
  286.      (!Check_Map(mon[m_no].x + mon[m_no].dx, mon[m_no].y - 1, mon[m_no].z, PICKUP, 0, 1)))
  287.   mon[m_no].dy = -1;
  288.  
  289. /* if ((mon[m_no].dx) && (mon[m_no].dy))
  290.  {
  291.   if (rand()%2) mon[m_no].dx = 0;
  292.   else mon[m_no].dy = 0;
  293.  }*/
  294.  
  295.  if (mon[m_no].dy == -1) mon[m_no].dir = 1;
  296.  if (mon[m_no].dx == 1) mon[m_no].dir = 2;
  297.  if (mon[m_no].dy == 1) mon[m_no].dir = 4;
  298.  if (mon[m_no].dx == -1) mon[m_no].dir = 8;
  299. }
  300.  
  301. void Monster_Die_Check(void)
  302. {
  303.  int i;
  304.  
  305.  for (i = 0; i < mon_count; i++)
  306.  {
  307.   if (map_laser[mon[i].x/32][mon[i].y/32][mon[i].z/8])
  308.   {
  309.    Add_Explode(mon[i].x/32, mon[i].y/32, mon[i].z/8);
  310.    Del_Monster(i);
  311.    i--;
  312.   }
  313.  
  314.   if (map_laser[(mon[i].x + 31)/32][mon[i].y/32][mon[i].z/8])
  315.   {
  316.    Add_Explode((mon[i].x + 31)/32, mon[i].y/32, mon[i].z/8);
  317.    Del_Monster(i);
  318.    i--;
  319.   }
  320.  
  321.   if (map_laser[mon[i].x/32][(mon[i].y + 31)/32][mon[i].z/8])
  322.   {
  323.    Add_Explode(mon[i].x/32, (mon[i].y + 31)/32, mon[i].z/8);
  324.    Del_Monster(i);
  325.    i--;
  326.   }
  327.  
  328.   if (map_laser[(mon[i].x + 31)/32][(mon[i].y + 31)/32][mon[i].z/8])
  329.   {
  330.    Add_Explode((mon[i].x + 31)/32, (mon[i].y + 31)/32, mon[i].z/8);
  331.    Del_Monster(i);
  332.    i--;
  333.   }
  334.  }
  335. }
  336.  
  337. void Del_Monster(int m_no)
  338. {
  339.  int i;
  340.  
  341.  DirtyList(mon[m_no].x, mon[m_no].y, mon[m_no].z, 32, 40, blank);
  342.  
  343.  for (i = m_no; i < mon_count; i++)
  344.  {
  345.   mon[i].x = mon[i + 1].x;
  346.   mon[i].y = mon[i + 1].y;
  347.   mon[i].z = mon[i + 1].z;
  348.   mon[i].dx = mon[i + 1].dx;
  349.   mon[i].dy = mon[i + 1].dy;
  350.   mon[i].dz = mon[i + 1].dz;
  351.  
  352.   mon[i].dir = mon[i + 1].dir;
  353.   mon[i].state = mon[i + 1].state;
  354.   mon[i].type = mon[i + 1].type;
  355.   mon[i].frame = mon[i + 1].frame;
  356.   mon[i].speed = mon[i + 1].speed;
  357.   mon[i].count = mon[i + 1].count;
  358.  }
  359.  mon_count--;
  360. }
  361.